<?php
namespace app\task\job;

use think\queue\Job;
use think\facade\Log;

/**
 * @Title: app\task\job$Demo
 * @author max
 * @date 2021年12月08日
 */
/*
 使用示例一:
 直接使用公共方法调用  Queue::push('app\task\job\Demo', $arrayData, $queueName);
 $arrayData: 是要传入的数据
 $queueName: 字符串,队列名字,例:demoQueue
 使用示例二:
 Queue::push('app\task\job\Demo@fire', $arrayData, $queueName);
 @后面就是指定使用队列文件中那个方法作为入口,如果不填写就默认fire
 */
class Demo{
    /**
     * 队列入口
     * @param Job $job
     * @param $data
     */
    public function fire(Job $job, $data)
    {
        //有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->handle($data);

        if ($isJobDone) {
            //如果任务执行成功，记得删除任务
            $job->delete();
        }else{
            //通过这个方法可以检查这个任务已经重试了几次了
            if ($job->attempts() > 3){
                Log::error('试了3次了');
                $job->delete();

                //也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间，表示该任务延迟2秒后再执行
            }
        }
    }


    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param $data
     * @return bool
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data){
        return true;
    }


    /**
     * 处理
     * @param $data
     * @return bool
     */
    public function handle($data)
    {
        //记录日志
        Log::info(date('Y-m-d H:i:s').' - data：'.json_encode($data));
        return true;
    }
}